package dane;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

/**
 * Program <code>Music Store</code>
 * Klasa <code>Zapytania</code> tworzy zapytania do bazy danych SQL 
 * @version 1.0 2013
 * @author Dorota Chyła, Tomasz Bednarski, Wojciech Florkowski, Łukasz Gąsiewicz
 */
public class Zapytania {
	
	/**
	 * Konstruktor bezparametrowy
	 */
	public Zapytania() {

	}

	/**
	 * Metoda odpowiadająca za dodawanie danych do bazy danych
	 * @param zapytanie SQL
	 */
	public void dodaj(String zapytanie) {
		Connection c = null;
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			c = DriverManager
					.getConnection(
							"jdbc:mysql://localhost/sklep?useUnicode=true&characterEncoding=UTF-8",
							"root", "");// dane do MySQL
			System.out
					.println("Zapytanie(dodaj): Udało się połączyć z bazą danych...");

		} catch (ClassNotFoundException e) {
			System.err
					.println("Zapytania(dodaj): Problem z driverem bazy danych...");
		} catch (SQLException e) {
			System.err
					.println("Zapytania(dodaj): Nie można połączyć się z baza danych...");
		} catch (Exception e) {
			System.err
					.println("Zapytania(dodaj): Błąd przy połączeniu z bazą danych...");
		}
		// wykonujemy SELECT i wypisujemy wynik zapytania na ekran
		try {
			Statement st = c.createStatement();
			System.out.println("Zapytania(dodaj): przed");
			st.executeUpdate(zapytanie); // wykonanie zapytania
		} catch (Exception e) {
			System.err
					.println("Zapytania(dodaj): Błąd przy pobieraniu danych... "
							+ e);
		}

		// zamykamy połączenie (jeżeli było otwarte)
		if (c != null) {
			try {
				c.close();
				System.out
						.println("Zapytania(dodaj): Połączenie z bazą danych zamknięte...");
			} catch (Exception e) {
				System.err
						.println("Zapytania(dodaj): Błąd przy zamykaniu bazy danych...");
			}
		}
	}

	/**
	 * Metoda pobierająca z bazy danych dane dotyczące albumów
	 * @param zap zapytanie SQL
	 * @return Towar
	 */
	public Towar[] getAllTowar(String zap) {
		Connection c = null;
		ResultSet rs = null;
		Vector vector = new Vector();
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			c = DriverManager
					.getConnection(
							"jdbc:mysql://localhost/sklep?useUnicode=true&characterEncoding=UTF-8",
							"root", "");// dane do MySQL
			System.out
					.println("Zapytanie(getAllTowar): Udało się połączyć z bazą danych...");

		} catch (ClassNotFoundException e) {
			System.err
					.println("Zapytania(getAllTowar): Problem z driverem bazy danych...");
		} catch (SQLException e) {
			System.err
					.println("Zapytania(getAllTowar): Nie można połączyć się z baza danych...");
		} catch (Exception e) {
			System.err
					.println("Zapytania(getAllTowar): Błąd przy połączeniu z bazą danych...");
		}
		// wykonujemy SELECT i wypisujemy wynik zapytania na ekran
		try {
			Statement st = c.createStatement();
			rs = st.executeQuery("SELECT t.id_towaru, gatunek_muzyki, nazwa_albumu, rok_wydania, ilosc_magazyn, nazwa_zespolu, cena_magazyn "
					+ "FROM ((((towar_muzycy tm JOIN muzycy m ON tm.id_muzyka=m.id_muzyka) "
					+ "JOIN Towar t ON t.id_towaru=tm.id_towaru) "
					+ "JOIN towar_utwory tu ON t.id_towaru=tu.id_towaru) "
					+ "JOIN utwory u ON tu.id_utworu=u.id_utworu) "
					+ zap
					+ " GROUP BY t.id_towaru ORDER BY nazwa_albumu");

			while (rs.next()) {
				Towar t = new Towar(rs.getString("nazwa_albumu"),
						rs.getString("gatunek_muzyki"),
						rs.getString("rok_wydania"),
						rs.getInt("ilosc_magazyn"),
						rs.getFloat("cena_magazyn"), rs.getInt("id_towaru"),
						rs.getString("nazwa_zespolu"));
				vector.addElement(t);
			}
			Towar[] towar = new Towar[vector.size()];
			vector.toArray(towar);
			return towar;

		} catch (Exception e) {
			System.err
					.println("Zapytania(getAllTowar): Błąd przy pobieraniu danych... "
							+ e);
		}

		// zamykamy połączenie (jeżeli było otwarte)
		if (c != null) {
			try {
				c.close();
				System.out
						.println("Zapytania(getAllTowar): Połączenie z bazą danych zamknięte...");
			} catch (Exception e) {
				System.err
						.println("Zapytania(getAllTowar): Błąd przy zamykaniu bazy danych...");
			}
		}
		return null;
	}

	/**
	 * Metoda pobierająca z bazy danych dane dotyczące zamówień
	 * @param zap zapytanie SQL
	 * @return Towar
	 */
	public Zamow[] getAllZam(String zap) {
		Connection c = null;
		ResultSet rs = null;
		Vector vector = new Vector();
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			c = DriverManager
					.getConnection(
							"jdbc:mysql://localhost/sklep?useUnicode=true&characterEncoding=UTF-8",
							"root", "");// dane do MySQL
			System.out
					.println("Zapytanie(getAllZam): Udało się połączyć z bazą danych...");

		} catch (ClassNotFoundException e) {
			System.err
					.println("Zapytania(getAllZam): Problem z driverem bazy danych...");
		} catch (SQLException e) {
			System.err
					.println("Zapytania(getAllZam): Nie można połączyć się z baza danych...");
		} catch (Exception e) {
			System.err
					.println("Zapytania(getAllZam): Błąd przy połączeniu z bazą danych...");
		}
		// wykonujemy SELECT i wypisujemy wynik zapytania na ekran
		try {
			Statement st = c.createStatement();
			rs = st.executeQuery("SELECT z.id_zamowienia, data_zlozenia, data_wysylki, SUM(ilosc*cena) AS wartosc "
					+ "FROM (zamowienia z JOIN zamowiony_towar zt ON z.id_zamowienia=zt.id_zamowienia)"
					+ " JOIN klienci k ON z.id_klienta=k.id_klienta "
					+ zap
					+ " GROUP BY z.id_zamowienia ORDER BY data_zlozenia DESC;");

			while (rs.next()) {
				Zamow z = new Zamow(rs.getInt("id_zamowienia"),
						rs.getString("data_zlozenia"),
						rs.getString("data_wysylki"), rs.getFloat("wartosc"));
				vector.addElement(z);
			}
			Zamow[] zamow = new Zamow[vector.size()];
			vector.toArray(zamow);
			return zamow;

		} catch (Exception e) {
			System.err
					.println("Zapytania(getAllZam): Błąd przy pobieraniu danych... "
							+ e);
		}

		// zamykamy połączenie (jeżeli było otwarte)
		if (c != null) {
			try {
				c.close();
				System.out
						.println("Zapytania(getAllZam): Połączenie z bazą danych zamknięte...");
			} catch (Exception e) {
				System.err
						.println("Zapytania(getAllZam): Błąd przy zamykaniu bazy danych...");
			}
		}
		return null;
	}

	/**
	 * Metoda pobierająca z bazy danych dane dotyczące utworów
	 * @param zap zapytanie SQL
	 * @return Towar
	 */
	public Utwory[] getSelectMusic(int sql) {
		Connection c = null;
		ResultSet rs = null;
		Vector vector = new Vector();
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			c = DriverManager
					.getConnection(
							"jdbc:mysql://localhost/sklep?useUnicode=true&characterEncoding=UTF-8",
							"root", "");// dane do MySQL
			System.out
					.println("Zapytanie(getSelectMusic): Udało się połączyć z bazą danych...");

		} catch (ClassNotFoundException e) {
			System.err
					.println("Zapytania(getSelectMusic): Problem z driverem bazy danych...");
		} catch (SQLException e) {
			System.err
					.println("Zapytania(getSelectMusic): Nie można połączyć się z baza danych...");
		} catch (Exception e) {
			System.err
					.println("Zapytania(getSelectMusic): Błąd przy połączeniu z bazą danych...");
		}
		// wykonujemy SELECT i wypisujemy wynik zapytania na ekran
		try {
			Statement st = c.createStatement();
			rs = st.executeQuery("SELECT u.id_utworu, tytul, czas_trwania FROM ((Towar t JOIN towar_utwory tu ON t.id_towaru=tu.id_towaru)JOIN utwory u ON tu.id_utworu=u.id_utworu) WHERE t.id_towaru= "
					+ sql + ";");

			while (rs.next()) {
				Utwory u = new Utwory(rs.getInt("id_utworu"),
						rs.getString("tytul"), rs.getString("czas_trwania"));
				vector.addElement(u);
			}
			Utwory[] utwory = new Utwory[vector.size()];
			vector.toArray(utwory);
			return utwory;

		} catch (Exception e) {
			System.err
					.println("Zapytania(getSelectMusic): Błąd przy pobieraniu danych... "
							+ e);
		}

		// zamykamy połączenie (jeżeli było otwarte)
		if (c != null) {
			try {
				c.close();
				System.out
						.println("Zapytania(getSelectMusic): Połączenie z bazą danych zamknięte...");
			} catch (Exception e) {
				System.err
						.println("Zapytania(getSelectMusic): Błąd przy zamykaniu bazy danych...");
			}
		}
		return null;
	}

	/**
	 * Metoda pobierająca z bazy danych ID obiektu
	 * @param zap zapytanie SQL
	 * @param id ID obiektu
	 * @return Towar
	 */
	public int getID(String zap, String id) {
		Connection c = null;
		ResultSet rs = null;
		int var = 0;
		;
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			c = DriverManager
					.getConnection(
							"jdbc:mysql://localhost/sklep?useUnicode=true&characterEncoding=UTF-8",
							"root", "");// dane do MySQL
			System.out.println("Zapytanie(getIDZam " + id
					+ "): Udało się połączyć z bazą danych...");

		} catch (ClassNotFoundException e) {
			System.err.println("Zapytania(getID: " + id
					+ "): Problem z driverem bazy danych...");
		} catch (SQLException e) {
			System.err.println("Zapytania(getID " + id
					+ "): Nie można połączyć się z baza danych...");
		} catch (Exception e) {
			System.err.println("Zapytania(getID " + id
					+ "): Błąd przy połączeniu z bazą danych...");
		}
		// wykonujemy SELECT i wypisujemy wynik zapytania na ekran
		try {
			Statement st = c.createStatement();
			rs = st.executeQuery(zap);

			while (rs.next()) {
				var = rs.getInt(id);
			}
			return var;

		} catch (Exception e) {
			System.err.println("Zapytania(getID " + id
					+ "): Błąd przy pobieraniu danych... " + e);
		}

		// zamykamy połączenie (jeżeli było otwarte)
		if (c != null) {
			try {
				c.close();
				System.out.println("Zapytania(getID " + id
						+ "): Połączenie z bazą danych zamknięte...");
			} catch (Exception e) {
				System.err.println("Zapytania(getID " + id
						+ "): Błąd przy zamykaniu bazy danych...");
			}
		}
		return 0;
	}
	/**
	 * Metoda pobierająca z bazy danych dane albumów, wykorzystywane do statystyk
	 * @param zap zaptanie SQL
	 * @return Towar
	 */
	public Towar[] getAllTowarToStatic(String zap) {
		Connection c = null;
		ResultSet rs = null;
		Vector vector = new Vector();
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			c = DriverManager
					.getConnection(
							"jdbc:mysql://localhost/sklep?useUnicode=true&characterEncoding=UTF-8",
							"root", "");// dane do MySQL
			System.out
					.println("Zapytanie(getAllTowar): Udało się połączyć z bazą danych...");

		} catch (ClassNotFoundException e) {
			System.err
					.println("Zapytania(getAllTowar): Problem z driverem bazy danych...");
		} catch (SQLException e) {
			System.err
					.println("Zapytania(getAllTowar): Nie można połączyć się z baza danych...");
		} catch (Exception e) {
			System.err
					.println("Zapytania(getAllTowar): Błąd przy połączeniu z bazą danych...");
		}
		// wykonujemy SELECT i wypisujemy wynik zapytania na ekran
		try {
			Statement st = c.createStatement();
			rs = st.executeQuery("SELECT t.id_towaru, gatunek_muzyki, nazwa_albumu, rok_wydania, ilosc_magazyn, cena_magazyn "
					+ "FROM (Towar t JOIN zamowiony_towar zt ON t.id_towaru=zt.id_towaru ) "
					+ "JOIN zamowienia z ON zt.id_zamowienia=z.id_zamowienia"
					+ zap + " GROUP BY t.id_towaru ORDER BY nazwa_albumu");

			while (rs.next()) {
				Towar t = new Towar(rs.getString("nazwa_albumu"),
						rs.getString("gatunek_muzyki"),
						rs.getString("rok_wydania"),
						rs.getInt("ilosc_magazyn"),
						rs.getFloat("cena_magazyn"), rs.getInt("id_towaru"), "");
				vector.addElement(t);
			}
			Towar[] towar = new Towar[vector.size()];
			vector.toArray(towar);
			return towar;

		} catch (Exception e) {
			System.err
					.println("Zapytania(getAllTowar): Błąd przy pobieraniu danych... "
							+ e);
		}

		// zamykamy połączenie (jeżeli było otwarte)
		if (c != null) {
			try {
				c.close();
				System.out
						.println("Zapytania(getAllTowar): Połączenie z bazą danych zamknięte...");
			} catch (Exception e) {
				System.err
						.println("Zapytania(getAllTowar): Błąd przy zamykaniu bazy danych...");
			}
		}
		return null;
	}
}
